/*
 * ModSysTimerAVRxx4.c
 *
 * Created: 20/03/2012 09:00:30
 *  Author: marionse
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/atomic.h>

#include "ModSysTimer.h"


/**
* \brief FONCTION PRIVEE DU MODULE
*/


/**
* \brief VARIABLES PRIVEE DU MODULE
*/
static struct  
{
	TSysTime sys_timer_value; // external timer value en pas de 1ms 
}sys_timer;


/**
* \brief fonction d'initialisation du module
*/
ERetCode ModSysTimerInit( void )
{
	ERetCode lo_ret_code = E_RET_SUCCESS;
	
	/** variable */
	sys_timer.sys_timer_value = 0U;
	
	/** initialise le timer 8bit en free runing 
	    avec un output compare a 1ms */
	/** timer 0 sur avr atmegaxx4 */
	
	/** active le peripherique */
	PRR &= ~(1U << PRTIM0);
	
	/** configure la predivision pour avoir un increment toute les secondes */
	/** assume que la clock cpu est a 8MHz */
	//freq	8000000			
	//div	pas increment en us	limite a 255 en us	nb incr pour 1 ms
	//1		0,125				31,875				8000
	//8		1					255					1000
	//64	8					2040				125
	//256	32					8160				31,25
	//1024	128					32640				7,8125
	/** on retient une division par 64 avec une interruption toute les ms sur le compA */	
	TCCR0B = ((0U<<CS02)|(1U<<CS01)|(1U<<CS00));
	
	/** init la valeur de depart */
	TCNT0 = 0;	
	
	/** charge la valeur d'interruption */
	OCR0A = 125;
	
	/** demarre l'interruption */
	TIFR0 = (1<<OCF0A);
	TIMSK0 = (1U << OCF0A);

	return lo_ret_code;
}

/**
* \brief fonction appelee a chaque passage dans la boucle main
*/
ERetCode ModSysTimerTick( void )
{
	ERetCode lo_ret_code = E_RET_SUCCESS;
	
	return lo_ret_code;
}

/**
* \brief fonction d'interrogation de la valeur du timer
*/
TSysTime SysTimerGetValue( void )
{
	TSysTime lo_value;
	
	ATOMIC_BLOCK(ATOMIC_FORCEON)
	{
		lo_value = sys_timer.sys_timer_value;
	}
	
	return lo_value;
}


/**
* \brief CompA ISR
*/
ISR(TIMER0_COMPA_vect)
{
	sys_timer.sys_timer_value += 1;
	
	OCR0A = (OCR0A + 125);
}